//
// Created by LiuYou on 2021/6/18.
//

#include <cstdlib>
#include "MyTBF.hpp"

class MyTbf;

constexpr int MyTokenBucket::getMyTBFMax() {
    return 1024;
}


namespace MyTokenBucket {
    static MyTbf* job[getMyTBFMax()];
    struct MyTbf {
        int cps;
        int burst;
        int token;
    };

}

// TODO 注意: 这里CLion自动生成的。
/*
void* MyTokenBucket::myTbfInit(int cps, int burst) {
    return nullptr;
}

int MyTokenBucket::fetchToken(void*, int) {
    return 0;
}

int MyTokenBucket::returnToken(void*, int) {
    return 0;
}

int MyTokenBucket::myTbfDestroy(void*) {
    return 0;
}*/

static int getFreePos() {
    for (int i = 0; i < MyTokenBucket::getMyTBFMax(); ++i) {
        if (MyTokenBucket::job[i] == nullptr) {
            return i;
        }
    }
    return -1;
}

// TODO 注意: 这个是跟着慧琴老师写的。
MyTokenBucket::MyTBF* MyTokenBucket::myTbfInit(int cps, int burst) {
    int pos = getFreePos();
    if (pos < 0) {
        return nullptr;
    }
    MyTbf* me = static_cast<MyTbf*>(malloc(sizeof(*me)));
    if (me == nullptr) {
        return nullptr;
    }
    me->token = 0;
    me->cps = cps;
    me->burst = burst;
    // TODO 注意: 这个错误我不知道为什么？？？？
//    job[pos] = me;
    return me;
}

int MyTokenBucket::fetchToken(MyTokenBucket::MyTBF*, int) {
    return 0;
}

int MyTokenBucket::returnToken(MyTokenBucket::MyTBF*, int) {
    return 0;
}

int MyTokenBucket::myTbfDestroy(MyTokenBucket::MyTBF*) {
    return 0;
}
